home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 11
/
FM Towns Free Software Collection 11.iso
/
t_os
/
tool
/
zc
/
src
/
tcom.c
< prev
next >
Wrap
Text File
|
1995-08-03
|
13KB
|
498 lines
#include <stdio.h>
#include "stdlib.h"
#include "string.h"
#include "egb.h"
#include "FMCFRB.H"
#include <msdos.cf>
/* #include "zc.h" */
#define KBUF_SIZE (640 * 480 * 2)
#define SPACE_DELM 0
#define SPACE_SKIP 1
extern char gwork[]; /* グラフィックワ-ク */
extern int svar[];
extern char *guiEgbPtr ; /* mov生成用ワークアドレス */
extern char *rbuf ; /* mov生成用ワークアドレス */
extern char *bbuf ; /* mov生成用ワークアドレス */
extern int pacRough;
extern int idouMode;
extern int pacFilter;
extern int mode; /* 1=2色 4=16色 8=256色 16=32k色 */
extern int ovr; /* 重ね合わせ濃度 */
extern int aflg; /* 加算フラグ */
extern int sx,sy; /* ズ-ム大きさ */
extern int ix,iy; /* 読み込み位置 */
int Get_word();
int ComFile( char *filename, short int *kbuf)
{
FILE *fp;
char word[80];
int delm;
char tracetext[80];
char com;
char outfile[16], infile[16], prefix[80];
int outmode;
int fflg;
short int *twbuf; /* きらきら用バッファ */
int twflag, twvalue, twrange;
if((fp = fopen(filename,"r")) == NULL){
return 0;
}
memset( outfile, 0, sizeof(outfile));
memset( prefix, 0, sizeof(prefix) );
outmode = 0;
/* コマンドファイル終了までのループ */
fflg = 0;
while(delm=Get_word(&fp, word, sizeof(word), SPACE_DELM), delm != EOF){
if( delm == EOF ){
break;
}
if( word[0] == '\0' ){
continue;
}
if( delm == '(' ){ /* '?('の形ならwordはコマンド */
com = word[0];
switch( com ){
case 'v': /* v(動画ファイル名 ラフレ-ト,ソフトネス, */
case 'V': /* 左上X, 左上Y, 右下X, 右下Y) */
/* 出力モード ラフレ-ト ソフトネス 録画範囲の初期値セット */
outmode = 2;
svar[0] = 0 ;
svar[1] = 0 ;
svar[2] = pacRough ;
svar[3] = idouMode * 8 ;
svar[4] = 0 ;
svar[5] = 0 ;
svar[6] = 319 ;
svar[7] = 239 ;
svar[11] = pacFilter ;
rbuf = malloc(153600);
memset( rbuf, 0, 153600);
bbuf = malloc(524288);
memset( rbuf, 0, 524288);
guiEgbPtr = gwork;
/* 出力動画ファイル名 */
delm = Get_word( &fp, outfile, sizeof(outfile)-5, SPACE_SKIP);
if( NULL == memchr(outfile, '.',sizeof(outfile)) ){
strcat( outfile, ".mov");
}
sprintf(tracetext, "movfilename=%s\n", outfile);
trace(tracetext);
if( delm == ')' ){
break;
} else if( delm != ','){
sprintf(tracetext,"m(動画ファイル名の次の文字が誤りです 文字=%c\n", delm);
trace(tracetext);
exit(-1);
}
/* ラフレ-ト */
delm = Get_word( &fp, word, sizeof(word), SPACE_SKIP);
if( word[0] != '\0' ){ /* 省略されていなければ変更 */
pacRough = atoi(word);
svar[2] = pacRough ;
}
if( delm == ')' ){
break;
} else if( delm != ','){
sprintf(tracetext,"m(動画ファイル名,ラフレートの次の文字が誤りです 文字=%c\n", delm);
trace(tracetext);
exit(-1);
}
/* ソフトネス */
delm = Get_word( &fp, word, sizeof(word), SPACE_SKIP);
if( word[0] != '\0' ){ /* 省略されていなければ変更 */
pacFilter = atoi(word);
svar[11] = pacFilter ;
}
if( delm == ')' ){
break;
} else if( delm != ','){
sprintf(tracetext,"m(動画ファイル名,ラフレート,ソフトネスの次の文字が誤りです 文字=%c\n", delm);
trace(tracetext);
exit(-1);
}
/* 録画範囲(左上x) */
delm = Get_word( &fp, word, sizeof(word), SPACE_SKIP);
if( word[0] != '\0' ){ /* 省略されていなければ変更 */
svar[4] = atoi(word);
}
if( delm == ')' ){
break;
} else if( delm != ','){
sprintf(tracetext,"m(動画ファイル名,ラフレート,ソフトネス,左上xの次の文字が誤りです 文字=%c\n", delm);
trace(tracetext);
exit(-1);
}
/* 録画範囲(左上y) */
delm = Get_word( &fp, word, sizeof(word), SPACE_SKIP);
if( word[0] != '\0' ){ /* 省略されていなければ変更 */
svar[5] = atoi(word);
}
if( delm == ')' ){
break;
} else if( delm != ','){
sprintf(tracetext,"m(動画ファイル名,ラフレート,ソフトネス,左上x, 左上yの次の文字が誤りです 文字=%c\n", delm);
trace(tracetext);
exit(-1);
}
/* 録画範囲(右下x) */
delm = Get_word( &fp, word, sizeof(word), SPACE_SKIP);
if( word[0] != '\0' ){ /* 省略されていなければ変更 */
svar[6] = atoi(word);
}
if( delm == ')' ){
break;
} else if( delm != ','){
sprintf(tracetext,"m(動画ファイル名,ラフレート,ソフトネス,左上x,左上y,右下xの次の文字が誤りです 文字=%c\n", delm);
trace(tracetext);
exit(-1);
}
/* 録画範囲(右下y) */
delm = Get_word( &fp, word, sizeof(word), SPACE_SKIP);
if( word[0] != '\0' ){ /* 省略されていなければ変更 */
svar[7] = atoi(word);
}
if( delm != ')' ){
sprintf(tracetext,"m(動画ファイル名,ラフレート,ソフトネス,左上x,左上y,右下x,右下yの次の文字が誤りです 文字=%c\n", delm);
trace(tracetext);
exit(-1);
}
break;
case 'o': /* o(出力TIFFファイル名) */
case 'O':
outmode = 1;
delm = Get_word( &fp, outfile, sizeof(outfile)-5, SPACE_SKIP);
if( NULL == memchr(outfile, '.',sizeof(outfile)) ){
strcat( outfile, ".tif");
}
if(delm != ')'){
sprintf(tracetext,"o(出力TIFFファイル名の次の文字が誤りです 文字=%c\n", delm);
trace(tracetext);
exit(-1);
}
break;
case 'p': /* 入力TIFFファイル名のプレフィックス */
case 'P':
delm = Get_word( &fp, prefix, sizeof(prefix), SPACE_SKIP);
if(delm != ')'){
sprintf(tracetext,"p(入力TIFFファイル名プレフィックス の次の文字が誤りです 文字=%c\n", delm);
trace(tracetext);
exit(-1);
}
break;
case 'l': /* 濃度 */
case 'L':
delm = Get_word( &fp, word, sizeof(word), SPACE_SKIP);
if(delm != ')'){
sprintf(tracetext,"l(濃度 の次の文字が誤りです 文字=%c\n", delm);
trace(tracetext);
exit(-1);
}
ovr = atoi( word );
if( ovr < 0 || ovr > 256 ){
sprintf(tracetext, "l(濃度の値が異常です0-256の範囲にして下さい 異常な値=%d)\n", ovr);
trace( tracetext );
exit( -1 );
}
break;
case 'm': /* 移動量 */
case 'M':
/* X */
delm = Get_word( &fp, word, sizeof(word), SPACE_SKIP);
if( word[0] == '\0'){
trace("m(移動量のXが指定されていません\n");
exit(-1);
}
if( delm == ')'){
trace("m(移動量のYが指定されていません\n");
exit(-1);
}
ix = atoi(word);
/* Y */
delm = Get_word( &fp, word, sizeof(word), SPACE_SKIP);
if( word[0] == '\0'){
trace("m(移動量のYが指定されていません\n");
exit(-1);
}
if( delm != ')'){
sprintf(tracetext, "m(移動量のYの次の文字が誤りです 文字=%d\n", delm);
trace( tracetext);
exit(-1);
}
iy = atoi(word);
break;
case 'z': /* 拡大/縮小 */
case 'Z':
/* X */
delm = Get_word( &fp, word, sizeof(word), SPACE_SKIP);
if( word[0] == '\0'){
trace("z(拡大/縮小量のXが指定されていません\n");
exit(-1);
}
if( delm == ')'){
trace("z(拡大/縮小量のYが指定されていません\n");
exit(-1);
}
sx = atoi(word);
/* Y */
delm = Get_word( &fp, word, sizeof(word), SPACE_SKIP);
if( word[0] == '\0'){
trace("z(拡大/縮小量のYが指定されていません\n");
exit(-1);
}
if( delm != ')'){
sprintf(tracetext, "z(拡大/縮小量のYの次の文字が誤りです 文字=%d\n", delm);
trace( tracetext);
exit(-1);
}
sy = atoi(word);
break;
case 'w':
case 'W':
twflag = 1;
/* 強さ */
delm = Get_word( &fp, word, sizeof(word), SPACE_SKIP);
if( word[0] == '\0'){
trace("w(透過光の強さが指定されていません\n");
exit(-1);
}
if( delm == ')'){
trace("w(透過光の大きさが指定されていません\n");
exit(-1);
}
twvalue = atoi(word);
/* 大きさ */
delm = Get_word( &fp, word, sizeof(word), SPACE_SKIP);
if( word[0] == '\0'){
trace("w(透過光の大きさが指定されていません\n");
exit(-1);
}
if( delm != ')'){
sprintf(tracetext, "w(透過光の強さ,大きさの次の文字が誤りです 文字=%d\n", delm);
trace( tracetext);
exit(-1);
}
twrange = atoi(word);
break;
case 'a':
case 'A':
delm = Get_word( &fp, word, sizeof(word), SPACE_SKIP);
if(delm != ')'){
sprintf(tracetext,"a(加算合成フラグ の次の文字が誤りです 文字=%c\n", delm);
trace(tracetext);
exit(-1);
}
aflg = atoi( word );
if( aflg != 0 || aflg != 1 ){
sprintf(tracetext, "a(0又は1以外の値が指定されています 異常な値=%d)\n", aflg);
trace( tracetext );
exit( -1 );
}
break;
case 'b':
case 'B':
twflag = 2;
delm = Get_word( &fp, word, sizeof(word), SPACE_SKIP);
if(delm != ')'){
sprintf(tracetext,"b(暈しの程度 の次の文字が誤りです 文字=%c\n", delm);
trace(tracetext);
exit(-1);
}
twvalue = atoi(word);
if( twvalue < 0 || twvalue > 256 ){
sprintf(tracetext, "l(暈しの程度の値が異常です.0-256の範囲にして下さい 異常な値=%d)\n", twvalue);
trace( tracetext );
exit( -1 );
}
break;
}
} else { /* デリミタが'('以外なら wordがファイル名 */
/***************************************************
ファイル->GVRAM
****************************************************/
memset( infile, 0, sizeof(infile));
strcpy( infile, prefix );
strcat( infile, word );
FileToGvram( infile, &mode, ix, iy );
/***************************************************
GVRAM -> 重ね合わせ用バッファ
***************************************************/
switch( twflag ){
case 0: /* 普通の処理 */
GvramToBuf( kbuf );
break;
case 1: /* クロスフィルタ-付き透過光 */
twbuf = (short int*)malloc( KBUF_SIZE );
if( kbuf == NULL){
trace("Fail to malloc twbuf");
exit( -1 );
}
_fill_char( twbuf, KBUF_SIZE, 0 );
GvramToBuf( twbuf );
twinkle( twbuf, kbuf, twvalue, twrange );
twflag = 0;
free( twbuf );
break;
case 2: /* 暈し処理 */
twbuf = (short int*)malloc( KBUF_SIZE );
if( kbuf == NULL){
trace("Fail to malloc twbuf");
exit( -1 );
}
_fill_char( twbuf, KBUF_SIZE, 0 );
GvramToBuf( twbuf );
Gradate( twvalue, kbuf );
twflag = 0;
free( twbuf );
break;
}
}
if( delm == ';'){
/***************************************************
GVRAM -> ファイル
****************************************************/
sprintf(tracetext, "before BufToFile=%s\n", outfile);
trace(tracetext);
BufToFile(outmode, outfile, kbuf);
sprintf(tracetext, "after BufToFile=%s\n", outfile);
trace(tracetext);
fflg = 1;
aflg = 0;
ovr = 256;
ix = 0;
iy = 0;
_fill_char( kbuf, KBUF_SIZE, 0 );
}
}
fclose(fp);
return fflg;
}
/***************************************************************************
ファイルから単語を切り出す
**************************************************************************/
int Get_word( fp, word, size, smode )
FILE **fp;
char *word;
unsigned int size; /* word配列の大きさ */
int smode; /* 1..スペース,改行で単語が終ったら次に現れたスペース以外の文字を探してその文字をデミリタとして返す 0..スペース,改行は普通のデミリタ */
{
int inp, tmp;
int i;
char tracetext[160];
int delm;
/* スペースをスキップ */
do{
inp = fgetc( *fp );
}while( inp == ' ' );
/* デミリタ又が現れるまで単語とみなす */
i = 0;
while(i < size){
switch(inp){
case '/':
tmp = inp;
inp = fgetc( *fp );
switch( inp ){
case '/':
/* コメント読み飛ばす処理(行末まで) */
do{
inp = fgetc( *fp );
}while( inp != '\n' );
continue;
case '*':
/* コメント読み飛ばす処理(コメントおわりまで) */
SKIP_LOOP:
do{
inp = fgetc( *fp );
}while( inp != '*' );
inp = fgetc( *fp );
if( inp != '/'){
goto SKIP_LOOP;
}
inp = fgetc( *fp );
continue;
default:
word[i] = (char)tmp;
i ++;
word[i] = (char)inp;
i ++;
inp = fgetc(*fp);
continue;
}
case ' ':
case '\n':
if (smode == 1){
/*スペース,改行をスキップして見付けた文字をデミリタとして返す*/
do{
inp = fgetc( *fp );
}while( inp == ' ' );
}
case '(':
case ')':
case ',':
case ';':
case EOF:
delm = inp;
word[i] = '\0';
trace("Get_word return:");
trace(word);
return delm;
}
word[i] = (char )inp;
i ++;
inp = fgetc(*fp);
}
/* 1単語がsize以上ならエラー */
*(word + size) = '\0';
sprintf(tracetext, "単語の長さが長過ぎます 単語=%s\n", word);
trace( tracetext );
exit( -1 );
return '\0';
}